import { ElMessage } from 'element-plus'
import qs from 'qs'
import { SUCCESS_CODE, TRANSFORM_REQUEST_DATA } from '@/constants'
import { useUserStoreWithOut } from '@/store/modules/user'
import { objToFormData } from '@/utils'
import router from '@/router'

// 请求拦截器
const defaultRequestInterceptors = (config) => {
  // POST 表单处理
  if (config.method === 'post') {
    if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
      config.data = qs.stringify(config.data)
    } else if (
      TRANSFORM_REQUEST_DATA &&
      config.headers['Content-Type'] === 'multipart/form-data' &&
      !(config.data instanceof FormData)
    ) {
      config.data = objToFormData(config.data)
    }
  }

  // GET 参数拼接

  if (config.method === 'get' && config.params) {
    const queryString = qs.stringify(config.params, {
      encode: true,
      indices: false
    })
    config.url = config.url + '?' + queryString
    config.params = {}
  }

  return config
}

// ✅ 响应拦截器
const defaultResponseInterceptors = (response) => {

  const headers = response.headers || {}

  // 文件流 / 导出场景直接返回
  if (
    headers['content-disposition'] ||
    !/^application\/json/.test(headers['content-type']) ||
    response.config?.responseType === 'blob'
  ) {
    return response
  }

  const resData = response.data || {}

  // 非 JSON，但带 size（可能是 blob 出错）
  if (resData.size) {
    return Promise.reject({
      code: 500,
      message: '服务器内部错误',
      success: false
    })
  }

  // 业务失败
  if (resData.code && resData.code !== 200) {
    ElNotification({
      title: '网络请求失败',
      message: resData.message,
      type: 'error'
    })
    return Promise.reject(resData)
  }

  return resData
}

// 错误处理（未使用可按需接入）
const defaultErrorInterceptors = (error) => {
  const status = error?.response?.status
  const resData = error?.response?.data || {}

  // ✅ 优先展示后端返回的 message 或 msg 字段
  const message = resData.message || resData.msg || '请求失败'

  const notifyError = (text) => {
    ElNotification({
      title: '请求失败',
      message: text,
      type: 'error',
    })
  }

  if (status) {
    switch (status) {
      case 401:
        notifyError(message || '登录状态已过期，需要重新登录')
        const userStore = useUserStoreWithOut()
        userStore.logout?.()
        localStorage.clear()
        router.push('/login')
        break

      case 403:
        notifyError(message || '没有权限访问该资源')
        break

      case 404:
        notifyError(message || '资源不存在')
        router.push({ name: '404' })
        break

      case 500:
        notifyError(message || '服务器内部错误')
        break

      default:
        notifyError(message || '未知错误')
        break
    }
  } else {
    notifyError('请求超时，服务器无响应')
  }

  return Promise.reject(resData)
}

export { defaultRequestInterceptors, defaultResponseInterceptors, defaultErrorInterceptors }
